#include <iostream>
#include <string>
#include <vector>
using namespace std;


// class foo {
// public:
//     virtual void func() {
//         std::cout << "foo!" << std::endl;
//     } 
// };

// class A : public foo{
//     void func() override {
//         std::cout<< "A!" << std::endl;
//     }
// };

// int main() {
//     A a;
//     foo& fa = a;
//     fa.func();
//     return 0;
// }

// class foo {

// public:
//     foo(int i)
//     {
//         str = std::to_string(i);
//         std::cout << "构造函数" << std::endl;
//     }

//     foo(const foo& f) 
//         :str(f.str)
//     {
//         std::cout << "拷贝构造" << std::endl;
//     }

//     foo(foo&& f) {
//         str.swap(f.str);
//         std::cout << "移动构造" << std::endl;
//     }

//     ~foo() = default;

// private:
//     std::string str;
// };


// int main() {
//     std::vector<foo> v;
//     v.reserve(10);

//     for(int i = 0; i < 5; i++) {
//         v.emplace_back(i); // 5次构造函数
//         //v.push_back(foo(i));  // 5次构造和移动构造
//     }

//     return 0;
// }


// void func(int& x) {
// 	cout << "左值引用" << endl;
// }

// void func(const int& x) {
// 	cout << "const 左值引用" << endl;
// }

// void func(int&& x) {
// 	cout << "右值引用" << endl;
// }

// void func(const int&& x) {
// 	cout << "const 右值引用" << endl;
// }

// template <class T>
// void forwarder(T&& arg) {
// 	func(arg);  
// }

// int main() {
// 	//参数属性会退化成左值，一下输出均是左值引用输出
// 	int a = 10;
// 	forwarder(a);        
// 	forwarder(20);       

// 	const int b = 10;
// 	forwarder(b);        
// 	forwarder(move(b));
// }

void showlist() {
	cout << endl;
}

template <class T, class... Args>
void showlist(T x, Args... args) {
	cout << x << " ";
	showlist(args...);
}


template <class... Args>
void Print(Args... args) {
	showlist(args...);
}

int main() {
	Print(123, "hello", 'f');
	return 0;
}

